<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>class类继承-内置对象</title>
</head>

<body>
  <script>
    /* 
      Array、Error等内置对象，在ES6中可以通过this访问父类的内部属性和方法，从而继承内置对象
    */
    
    /* 
      ES5中，无法实现自动更新子类的length属性
      ES6中，可以自动更新子类的length属性
    */

    /* class List extends Array {}
    var list = new List()
    console.log(list.length)
    list.push("a")
    console.log(list.length) */

    /* 
      Symbol.species
      在内置对象中，有些方法会返回自己的实例
    */

    /* class List1 extends Array {}
    var list1 = new List1(1, 2)
        console.log(segment = list1.slice(0, 1))
        console.log(segment instanceof List1) */

    /* 
      详解Symbol.species
      每个静态的只读访问器属性
    */

    /* class Array {
      static get [Symbol.species]() {
        return this
      }
    } */

    /* 
      如果想要内置对象的这些方法仍然返回他们自身的实例，那么就需要在子类中也声明一个相同的只读访问器属性，并返回相应的内置对象
    */

    class List extends Array {
      // 把父类的内置对象的属性和方法，继承过来
      static get [Symbol.species]() {
        return Array
      }
    }

    var list = new List(1, 2)
    console.log(segment = list.slice(0, 1))
    console.log(segment instanceof List)

    /* 
      new.target
    */

    class People {
      constructor() {
        new.target === People
        new.target === Man
        console.log(new.target === People)  // false
        console.log(new.target === Man)     // true
      }
    }

    class Man extends People {}
    var man = new Man()
  </script>
</body>

</html>